#pragma once
#include <iostream>
#include <string>
#include <unistd.h>
#include <pthread.h>
#include <functional>

/*
namespace ThreadModule
{
    template <class T>
    using func_t = std::function<void(T&)>;

    template <typename T>
    class Thread
    {
    public:
        Thread(func_t<T> func, T data, const string &threadname = "new thread")
            : _func(func), _data(data), _threadname(threadname), _stop(true)
        {
        }
        static void *threadroutine(void *args)//类内成员函数第一个参数为this指针,采用static修饰
        {
            while(true)
            {
                std::cout<<"I am new thread!"<<endl;
                sleep(1);
            }
        }
        bool Start()
        {
            int n = pthread_create(&_tid, nullptr, threadroutine, nullptr);
            if (n == 0)
            {
                _stop = false;
                return true;
            }
            else
            {
                return false;
            }
        }
        void Join()
        {
            if (_stop != true)
            {
                pthread_join(_tid, nullptr);
            }
        }

        void Detach()
        {
            if (_stop != true)
            {
                pthread_detach(_tid);
            }
        }

        //暂停线程
        void Stop()
        {
            _stop=true;
        }
    private:
        pthread_t _tid;          // 线程用户级标识符
        std::string _threadname; // 线程名
        func_t<T&> _func;         // 线程的执行方法
        T& _data;                 // 传递给_func()函数的参数
        bool _stop;              // 线程的运行状态
    };
}
*/

namespace ThreadModule
{
    template <class T>
    using func_t = std::function<void(T&)>;

    template <typename T>
    class Thread
    {
    public:
        Thread(func_t<T> func, T data, const string &threadname = "new thread")
            : _func(func), _data(data), _threadname(threadname), _stop(true)
        {
        }
        static void *threadroutine(void *args)//类内成员函数第一个参数为this指针,采用static修饰
        {
            while(true)
            {
                std::cout<<"I am new thread!"<<endl;
                sleep(1);
            }
        }
        bool Start()
        {
            int n = pthread_create(&_tid, nullptr, threadroutine, nullptr);
            if (n == 0)
            {
                _stop = false;
                return true;
            }
            else
            {
                return false;
            }
        }
        void Join()
        {
            if (_stop != true)
            {
                pthread_join(_tid, nullptr);
            }
        }

        void Detach()
        {
            if (_stop != true)
            {
                pthread_detach(_tid);
            }
        }

        //暂停线程
        void Stop()
        {
            _stop=true;
        }
    private:
        pthread_t _tid;          // 线程用户级标识符
        std::string _threadname; // 线程名
        func_t<T&> _func;         // 线程的执行方法
        T& _data;                 // 传递给_func()函数的参数
        bool _stop;              // 线程的运行状态
    };
}
